package pe.gob.osce.sirenas.wd.jsf.bean.registro;
/*
* Resumen.
* Objeto 				:	RegistroArbitroBean.java
* Descripcion 			: 	.
* Fecha de Creacion 	: 	26/02/2015.
* Pry de Creacion 		: 	RNA/RNS.
* Autor 				: 	Julio Cayulla.
* ================================================================================================
* Modificaciones
* Motivo						Fecha		Nombre				Descripcion
* ================================================================================================
*
*/
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;


import javax.faces.context.FacesContext;

import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;

import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.CapacitacionDTO;
import pe.gob.osce.sirenas.model.DocenciaDTO;
import pe.gob.osce.sirenas.model.EspecialidadAcademicaDTO;
import pe.gob.osce.sirenas.model.ExperienciaLaboralDTO;
import pe.gob.osce.sirenas.model.FichaArbitralDTO;
import pe.gob.osce.sirenas.model.FormacionAcademicaDTO;
import pe.gob.osce.sirenas.model.ParametrosDTO;
import pe.gob.osce.sirenas.model.SolicitudInscripcionDTO;
import pe.gob.osce.sirenas.model.TrayectoriaArbitralDTO;
import pe.gob.osce.sirenas.svc.ObtenerDatosComunesServiceLocal;
import pe.gob.osce.sirenas.svc.RegistrarFichaArbitroServiceLocal;
import pe.gob.osce.sirenas.util.ModeloException;
import pe.gob.osce.sirenas.util.NegocioException;
import pe.gob.osce.sirenas.wd.util.ConstanteWeb;
import pe.gob.osce.sirenas.wd.util.RepositorioDatos;
import pe.gob.osce.sirenas.wd.util.UBaseManage;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstCapacitacionDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstDocenciaDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstEspecialidadAcademicaDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstExpLaboralDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstFormacionAcademicaDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstTrayectoriaArbitralDS;

@ManagedBean(name="registroArbitroModalidadBean")
@SessionScoped
public class RegistroArbitroModalidadBean extends UBaseManage implements Serializable{

	private static final long serialVersionUID = 8223786763692900159L;

	final static Logger log = Logger.getLogger(RegistroArbitroModalidadBean.class);
	
	@EJB
	private	RegistrarFichaArbitroServiceLocal	registrarFichaArbitroService;
	@EJB
	private	ObtenerDatosComunesServiceLocal	obtenerDatosComunesService;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteWeb.PROPERTIES);

	private RequestContext context; 
	private AuditoriaDTO auditoria;
	private FichaArbitralDTO fichaArbitral;
	private String modalidad="";
	private List<String> msjValidacion;
	
	public void cerrarConfirmacionPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogConfirmacion').hide();");
	}
	public void cerrarValidacionPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogValidacion').hide();");
	}
	
	public void abrirConfirmacionPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogConfirmacion').show();");
	}
	public void abrirValidacionPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogValidacion').show();");
	}
	
	public void generarRegistroFicha(){
		fichaArbitral=(FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
		auditoria=(AuditoriaDTO)obtenerObjetoSession(ConstanteWeb.AUDITORIA);
		RepositorioDatos repositorioDatos=obtenerRepositorioDatos();
		Long correlativo=repositorioDatos.getCorrelativos().get(propSirenas.getString(ConstanteWeb.KEY_CORRELATIVO_FICHA));
		Calendar ahoraCal = Calendar.getInstance();
		int anio=ahoraCal.get(Calendar.YEAR);
		try {
			fichaArbitral.setIdEstadoFicha(repositorioDatos.getIdEstadoLista(ConstanteWeb.EST_REGISTRADO));
//			if(this.modalidad.equals(propSirenas.getString(ConstanteWeb.MOD_ARBITRO))){
//				fichaArbitral.setIndModalidadArbitro(repositorioDatos.getValueModalidadArbitraje(propSirenas.getString(ConstanteWeb.MOD_ARBITRO )));
//			}if(this.modalidad.equals(propSirenas.getString(ConstanteWeb.MOD_ARBITRO_UNIC))){
//				fichaArbitral.setIndModalidadArbitro(repositorioDatos.getValueModalidadArbitraje(propSirenas.getString(ConstanteWeb.MOD_ARBITRO_UNIC )));
//			}
			fichaArbitral.setNumFicha(anio+"-"+String.format("%0"+propSirenas.getString(ConstanteWeb.LENGTH_CORRELATIVO)+"d", correlativo));
			
			fichaArbitral.setFechaModalidad(new Date());
			registrarFichaArbitroService.generarFichaArbitral(fichaArbitral, auditoria);
						
			/**Actualizo la FIcha Arbtiral que esta en Session*/
			fichaArbitral=registrarFichaArbitroService.obtenerFichaArbitral(fichaArbitral);				
			String[] descEstado=repositorioDatos.getDescriptoresEstadoLista(fichaArbitral.getEstadoFicha().getIdEstado());
			fichaArbitral.getEstadoFicha().setNomEstado(descEstado[2]);
			
			if(fichaArbitral.getIdEstadoFicha()==Long.parseLong(propSirenas.getString(ConstanteWeb.ID_ESTADO_PENDIENTE))){
				fichaArbitral.setEsPendiente(true);
			}				
			
			if(fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.ARBITRO.toString())){
				if(fichaArbitral.getIndModalidadArbitro()!=null){
					fichaArbitral.setModalidadArbitro(repositorioDatos.getDescModalidadArbitraje(fichaArbitral.getIndModalidadArbitro().longValue() ));
				}else{
					fichaArbitral.setModalidadArbitro("No registra");
				}
				
			}if(fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString())){
				fichaArbitral.setModalidadArbitro(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString());
			}
			
			establecerObjetoSession(ConstanteWeb.FICHA_REGISTRO, fichaArbitral);
										
			
			/**Si todo sale Bien Actualizo el Correlativo*/
			ParametrosDTO parametro=new ParametrosDTO();
			parametro.setIdParametro(repositorioDatos.getValueParametro(propSirenas.getString(ConstanteWeb.KEY_CORRELATIVO_FICHA)) );
			parametro.setDescValor2(correlativo+1);
			obtenerDatosComunesService.actualizarCorrelativo(parametro, auditoria);
			

			cerrarConfirmacionPopup();
			RequestContext.getCurrentInstance().update("gridFichaArbitro");
			RequestContext.getCurrentInstance().update("idFormAcademicaArbitro");
			setMensajeroInfo("Ficha Registrada Satisfactoriamente");
		} catch (Exception e) {
			e.printStackTrace();
			setMensajeroError("No se pudo Registrar", "");
		}		
	}
	
	public void validarReglasGeneracion(){
		msjValidacion= new ArrayList<String>();
		fichaArbitral=(FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
		boolean indicadorReglas=false;

		try {		
			if(fichaArbitral.getIndModalidadArbitro()!=Integer.parseInt(propSirenas.getString(ConstanteWeb.VALORCERO))){
				
			//if(this.modalidad!=null && !this.modalidad.trim().equals("")){
				if(fichaArbitral.getIndModalidadArbitro()==Integer.parseInt(propSirenas.getString(ConstanteWeb.MOD_ARBITRO_ID).trim())){
					indicadorReglas=validaReglasArbitro();
				}if(fichaArbitral.getIndModalidadArbitro()==Integer.parseInt(propSirenas.getString(ConstanteWeb.MOD_ARBITRO_UNIC_ID).trim())){
					indicadorReglas=validaReglasArbitroUnico();
				}
				
				if(indicadorReglas){
					try {
						JasperPrint jasperSolicitud = new JasperPrint();
						jasperSolicitud=generaFichaPdf(jasperSolicitud,fichaArbitral);
						guardoReporteServidor(propSirenas.getString(ConstanteWeb.FS_FICHAS),"vistaPrevia"+fichaArbitral.getNumFicha(),jasperSolicitud);
						abrirConfirmacionPopup();
						
					}catch (NegocioException e) {
						setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
					}
				}else{
					abrirValidacionPopup();
				}
			}else{
				setMensajeroInfo("Debe seleccionar un Tipo de Modalidad Arbitral");
			}	
		}catch (Exception e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_SOLICITUD));
		}	
	}

	public boolean evaluaAcreditaFormAcademica(){
		boolean acreditaFormAcademica=false;
		ArrayList<FormacionAcademicaDTO> listaFormAcademica=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_FORM_ACADEMICA);
		for (FormacionAcademicaDTO formacionAcademicaDTO : listaFormAcademica) {
			String up=formacionAcademicaDTO.getDescAreaProfesion().trim().toUpperCase();
			String asdsad=propSirenas.getString(ConstanteWeb.PARAM_DERECHO).trim().toUpperCase();
			if(formacionAcademicaDTO.getDescAreaProfesion().trim().toUpperCase().equals(propSirenas.getString(ConstanteWeb.PARAM_DERECHO).trim().toUpperCase())){
				acreditaFormAcademica=true;
			}
		}
		return acreditaFormAcademica;
	}
	
	public boolean validaReglasArbitroUnico(){
		boolean acreditaContratacion=false;
		boolean acreditaArbitraje=false;
		boolean acreditaDerechoAdm=false;
		boolean acreditaFormAcademica=evaluaAcreditaFormAcademica();
		
		List<AcreditacionDTO> listaAcreditaciones = (ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_ACREDITACIONES); 
		for (AcreditacionDTO acreditacionDTO : listaAcreditaciones) {
			if(acreditacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)){
				acreditaContratacion=true;
			}if(acreditacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)){
				acreditaArbitraje=true;
			}if(acreditacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_DERECHO_ADM)){
				acreditaDerechoAdm=true;
			}
		}
		if(acreditaContratacion && acreditaArbitraje && acreditaDerechoAdm && acreditaFormAcademica){
			return true;
		}else{
			if(!acreditaContratacion)
				msjValidacion.add(propSirenas.getString(ConstanteWeb.ETIQ_ARB_CONTRATACIONES).replaceAll("<br/>", " ") );
			if(!acreditaArbitraje)
				msjValidacion.add(propSirenas.getString(ConstanteWeb.ETIQ_ARB_ARBITRAJE).replaceAll("<br/>", " ") );
			if(!acreditaDerechoAdm)
				msjValidacion.add(propSirenas.getString(ConstanteWeb.ETIQ_ARB_DERECHO ).replaceAll("<br/>", " ") );
			if(!acreditaFormAcademica)
				msjValidacion.add(propSirenas.getString(ConstanteWeb.ETIQ_ARB_ACADEMICO).replaceAll("<br/>", " ") );
			
			return false;
		}
	}
	
	/**Debe consignar al menos un registro en cualquiera de las acreditaciones para las Especialidades de:
		- Contrataciones del Estado
		- Arbitraje
	 **/
	public boolean validaReglasArbitro(){
		List<EspecialidadAcademicaDTO> listArbEspecialidadAcademica=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_ESPECIALIZACION);
		List<CapacitacionDTO> listArbEspecialCapacitacion=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_CAPACITACION);
		List<DocenciaDTO> listArbEspecialDocencia=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_DOCENCIA);
		List<TrayectoriaArbitralDTO> listArbEspecialTrayectoriaArbitralPublic=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_ARBITRAJE_PUB);
		List<TrayectoriaArbitralDTO> listArbEspecialTrayectoriaArbitralPriv=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_ARBITRAJE_PRIV);
		List<ExperienciaLaboralDTO> listArbEspecialExperienciaLaboral=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_EXP_LABORAL);
		boolean acreditaRegistros=false;

		for (EspecialidadAcademicaDTO especialidadAcademicaDTO : listArbEspecialidadAcademica) {
			if (especialidadAcademicaDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)) {
				acreditaRegistros=true;
			}if(especialidadAcademicaDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)) {
				acreditaRegistros=true;
			}
		}
		for (CapacitacionDTO capacitacionDTO : listArbEspecialCapacitacion) {
			if (capacitacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)) {
				acreditaRegistros=true;
			}if(capacitacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)) {
				acreditaRegistros=true;
			}
		}
		for (DocenciaDTO docenciaDTO : listArbEspecialDocencia) {
			if (docenciaDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)) {
				acreditaRegistros=true;
			}if(docenciaDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)) {
				acreditaRegistros=true;
			}
		}
		for (TrayectoriaArbitralDTO trayectoriaArbitralDTO : listArbEspecialTrayectoriaArbitralPublic) {
			if (trayectoriaArbitralDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)) {
				acreditaRegistros=true;
			}if(trayectoriaArbitralDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)) {
				acreditaRegistros=true;
			}
		}
		for (TrayectoriaArbitralDTO trayectoriaArbitralDTO : listArbEspecialTrayectoriaArbitralPriv) {
			if (trayectoriaArbitralDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)) {
				acreditaRegistros=true;
			}if(trayectoriaArbitralDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)) {
				acreditaRegistros=true;
			}
		}
		for (ExperienciaLaboralDTO experienciaLaboralDTO : listArbEspecialExperienciaLaboral) {
			if (experienciaLaboralDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)) {
				acreditaRegistros=true;
			}if(experienciaLaboralDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)) {
				acreditaRegistros=true;
			}
		}		
		return acreditaRegistros;
	}


	public void generaVistaPreviaFicha(){
		try {
			FichaArbitralDTO fichaArbitral=(FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
			JasperPrint jasperSolicitud = new JasperPrint();
			jasperSolicitud=generaFichaPdf(jasperSolicitud,fichaArbitral);
			guardoReporteServidor(propSirenas.getString(ConstanteWeb.FS_FICHAS),"vistaPrevia"+fichaArbitral.getNumFicha(),jasperSolicitud);
			
			RequestContext context = RequestContext.getCurrentInstance();
			context.execute("PF('dialogVisorPDF').show();");
		
		}catch (NegocioException e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
		
		} catch (Exception e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_SOLICITUD));
		}
	}
	
	public JasperPrint generaFichaPdf(JasperPrint jasperSolicitud,FichaArbitralDTO fichaArbitral) throws NegocioException{
		RepositorioDatos repositorioDatos=obtenerRepositorioDatos();
		
		List<FormacionAcademicaDTO> lstFormacionAcademica=ObtenerListaFormacionAcademica(repositorioDatos, fichaArbitral);
		List<EspecialidadAcademicaDTO> lstEspecialidadAcademica=ObtenerListaEspAcademica(repositorioDatos, fichaArbitral);
		List<TrayectoriaArbitralDTO>  lstArbitrajePrivado=ObtenerListaArbitrajePrivado(repositorioDatos, fichaArbitral);
		List<TrayectoriaArbitralDTO> lstArbitrajePublico=ObtenerListaArbitrajePublico(repositorioDatos, fichaArbitral);
		List<EspecialidadAcademicaDTO>  lstEspCapacitacion=ObtenerListaEspCapacitacion(repositorioDatos, fichaArbitral);
		List<DocenciaDTO> lstEspDocencia =ObtenerListaEspDocencia(repositorioDatos, fichaArbitral);
		List<ExperienciaLaboralDTO> lstExpLaboral=ObtenerListaExpLaboral(repositorioDatos, fichaArbitral);

		try {
			ReporteLstFormacionAcademicaDS formacionAcademicaDS = new ReporteLstFormacionAcademicaDS(	lstFormacionAcademica);
			ReporteLstEspecialidadAcademicaDS especialidadAcademicaDS = new ReporteLstEspecialidadAcademicaDS(	lstEspecialidadAcademica);
			ReporteLstCapacitacionDS capacitacionDS = new ReporteLstCapacitacionDS(lstEspCapacitacion);
			ReporteLstDocenciaDS docenciaDS = new ReporteLstDocenciaDS(lstEspDocencia);
			ReporteLstExpLaboralDS expLaboralDS = new ReporteLstExpLaboralDS(lstExpLaboral);
			ReporteLstTrayectoriaArbitralDS arbitrajePublicDS = new ReporteLstTrayectoriaArbitralDS(lstArbitrajePublico);
			ReporteLstTrayectoriaArbitralDS arbitrajePrivadoDS = new ReporteLstTrayectoriaArbitralDS(lstArbitrajePrivado);
			
			String rutaImagenLogo = "/recursos/imagenes/Sello Oficial.jpg";
			InputStream imgLogoSt = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(rutaImagenLogo);
			//IMAGEN
			String rutaSubReport=obtenerRutaServidor()+"reporte/jasper/";
			
			HashMap parametros = new HashMap();
			parametros.put("P_IMAGEN_LOGO", imgLogoSt);
			parametros.put("SUBREPORT_DIR", rutaSubReport);
			

			parametros.put("P_NRO_FICHA",""+((fichaArbitral.getNumFicha()==null)?"":fichaArbitral.getNumFicha() ));
			parametros.put("P_ESTADO_FICHA",""+ fichaArbitral.getEstadoFicha().getNomEstado());
			parametros.put("P_NRO_RUC", ""+fichaArbitral.getPersona().getNumRuc());
			parametros.put("P_NRO_DOCUMENTO", ""+fichaArbitral.getPersona().getNumDocumento());
			parametros.put("P_NOMBRE_COMPLETO", fichaArbitral.getPersona().getNombres()+" "+fichaArbitral.getPersona().getApPaterno()+" "+fichaArbitral.getPersona().getApMaterno());
			
			parametros.put("DS_FORM_ACADEMICA", formacionAcademicaDS);
			parametros.put("DS_ESP_ACADEMICA", especialidadAcademicaDS);
			parametros.put("DS_CAPACITACION",capacitacionDS );
			parametros.put("DS_DOCENCIA", docenciaDS);
			parametros.put("DS_LABORAL",expLaboralDS );
			parametros.put("DS_ARB_PUBLICO", arbitrajePublicDS);
			parametros.put("DS_ARB_PRIVADO", arbitrajePrivadoDS);

			parametros.put("PRINT_FORM_ACADEMICA", !lstFormacionAcademica.isEmpty());
			parametros.put("PRINT_ESP_ACADEMICA", !lstEspecialidadAcademica.isEmpty());
			parametros.put("PRINT_CAPACITACION", !lstEspCapacitacion.isEmpty());
			parametros.put("PRINT_DOCENCIA", !lstEspDocencia.isEmpty());
			parametros.put("PRINT_LABORAL", !lstExpLaboral.isEmpty());
			parametros.put("PRINT_ARB_PUBLICO", !lstArbitrajePublico.isEmpty());
			parametros.put("PRINT_ARB_PRIVADO", !lstArbitrajePrivado.isEmpty());
			
			
			JasperReport report = JasperCompileManager.compileReport(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/reporte/jasper/rptVistaPrevia.jrxml"));

			jasperSolicitud = JasperFillManager.fillReport(report,parametros);
			
		
		} catch (Exception e) {
			log.error(e.getMessage(),e);
			throw new NegocioException(e.getMessage(),e);
		}
		return jasperSolicitud;
	}

	public void generaConstanciaPdf()  throws ModeloException{
		JasperPrint jasperSolicitud;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/M/yyyy"); 
		FichaArbitralDTO fichaArbitralDTO= (FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
		RepositorioDatos repositorioDatos=obtenerRepositorioDatos();
		String acreditaciones="";
		/** Obtener Datos de la Constancia*/
		try {

			List<AcreditacionDTO> listaAcreditaciones=registrarFichaArbitroService.obtenerListaAcreditaciones(fichaArbitralDTO.getIdFicha());
			
			String rutaImagenLogo = "/recursos/imagenes/Sello Oficial.jpg";
			InputStream imgLogoSt = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(rutaImagenLogo);
			//IMAGEN
			HashMap parametros = new HashMap();
			parametros.put("P_IMAGEN_LOGO", imgLogoSt);

			if(fichaArbitralDTO.getModalidadArbitro().equals(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString())){
				parametros.put("P_TITULO", propSirenas.getString(ConstanteWeb.RPT_CONSTANCIA_SECRETARIO));
			}else{
				parametros.put("P_TITULO", propSirenas.getString(ConstanteWeb.RPT_CONSTANCIA_ARBITRO));
			}
			
			parametros.put("P_FEC_IMP", sdf.format(new Date()) );
			
			parametros.put("P_NUM_FICHA", fichaArbitralDTO.getNumFicha());
			parametros.put("P_NUM_RUC", ""+fichaArbitralDTO.getPersona().getNumRuc());
			parametros.put("P_NUM_DOC", fichaArbitralDTO.getPersona().getNumDocumento());
			
			parametros.put("P_MODALIDAD", fichaArbitralDTO.getModalidadArbitro());
			parametros.put("P_FEC_INSCRIPCION", (fichaArbitralDTO.getFechaModalidad()!=null)?sdf.format(fichaArbitralDTO.getFechaModalidad()):"");
			parametros.put("P_ESTADO_FICHA", fichaArbitralDTO.getEstadoFicha().getNomEstado());
			parametros.put("P_FEC_ESTADO", sdf.format(fichaArbitralDTO.getEstadoFicha().getAuditoriaDTO().getFecRegistro()));
			
			if(listaAcreditaciones==null || listaAcreditaciones.isEmpty()){
				acreditaciones="No registra acreditacion en ninguna especialidad.";
			}else{

				for (AcreditacionDTO acreditacionDTO : listaAcreditaciones) {
					if(acreditacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_CONTRATACIONES)){
						acreditaciones+="- ESPECIALIDAD EN CONTRATACIONES \n";
					}
					if(acreditacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_ARBITRAJE)){
						acreditaciones+="- ESPECIALIDAD EN ARBITRAJE \n";
					}
					if(acreditacionDTO.getIndEspecialidad().equals(ConstanteWeb.ESPECIALIDAD_DERECHO_ADM)){
						acreditaciones+="- ESPECIALIDAD EN DERECHO ADMINISTRATIVO";
					}
				}
			}

			parametros.put("P_ACREDITACION",acreditaciones);						
			
			JasperReport report = JasperCompileManager.compileReport(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/reporte/jasper/rptConstanciaFicha.jrxml"));

			jasperSolicitud = JasperFillManager.fillReport(report,parametros);
			
			guardoReporteServidor(propSirenas.getString(ConstanteWeb.FS_FICHAS),"Constancia_"+fichaArbitralDTO.getNumFicha(),jasperSolicitud);


			RequestContext context = RequestContext.getCurrentInstance();
			context.execute("PF('dialogVisorPDF').show();");
		} catch (ModeloException e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
		}catch (Exception e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_SOLICITUD));
		}
	}
	

	
	private List ObtenerListaFormacionAcademica(RepositorioDatos repositorioDatos,FichaArbitralDTO fichaArbitral){
		List<FormacionAcademicaDTO> listArbFormacionAcademica= new ArrayList<FormacionAcademicaDTO>();
		try {
			listArbFormacionAcademica=registrarFichaArbitroService.obtenerFichaFormacionAcademica(fichaArbitral.getIdFicha());		

			if (listArbFormacionAcademica!= null) {
				for (FormacionAcademicaDTO formacionAcademicaDTO : listArbFormacionAcademica) {
					formacionAcademicaDTO.setIdEstadoFicha(fichaArbitral.getIdEstadoFicha());
					formacionAcademicaDTO.setDescAreaProfesion(repositorioDatos.getLabelAreaProfesion(formacionAcademicaDTO.getIdAreaProfesion()).toUpperCase());
					formacionAcademicaDTO.setDescCentroEstudios(repositorioDatos.getLabelCentroEstudios(formacionAcademicaDTO.getIdCentroEstudios()).toUpperCase());
					if(formacionAcademicaDTO.getDescripcionOtroCentro()!=null)
						formacionAcademicaDTO.setDescripcionOtroCentro(formacionAcademicaDTO.getDescripcionOtroCentro().toUpperCase());
					formacionAcademicaDTO.setDescPais(repositorioDatos.getLabelPais(formacionAcademicaDTO.getIdPais()).toUpperCase());
					formacionAcademicaDTO.setDescGradoObtenido(repositorioDatos.getLabelParametro(formacionAcademicaDTO.getIndGradoObtenido()).toUpperCase());
					formacionAcademicaDTO.setDescripcionGrado(formacionAcademicaDTO.getDescripcionGrado().toUpperCase());
				}
			}else{
				return new ArrayList<FormacionAcademicaDTO>();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listArbFormacionAcademica;
	}

	public String getDescEspecialidad(Integer indEspecialidad){
		switch (indEspecialidad) {
		case 1:
			return "ESPECIALIDAD EN CONTRATACIONES";

		case 2:
			return "ESPECIALIDAD EN ARBITRAJE";

		case 3:
			return "ESPECIALIDAD EN DERECHO ADMINISTRATIVO";

		default:
			return "";
		}
	}
	
	public List ObtenerListaEspAcademica(RepositorioDatos repositorioDatos,FichaArbitralDTO fichaArbitral){
		List<EspecialidadAcademicaDTO> listArbEspecialidadAcademica= new ArrayList<EspecialidadAcademicaDTO>();
		try {
			listArbEspecialidadAcademica=registrarFichaArbitroService.obtenerFichaExpecialidadAcademica(fichaArbitral.getIdFicha());

			if (listArbEspecialidadAcademica != null) {
				for (EspecialidadAcademicaDTO especialidadAcademicaDTO : listArbEspecialidadAcademica) {
					especialidadAcademicaDTO.setDescEspecialidad(getDescEspecialidad(especialidadAcademicaDTO.getIndEspecialidad()) );
					especialidadAcademicaDTO.setIdEstadoFicha(fichaArbitral.getIdEstadoFicha());
					especialidadAcademicaDTO.setDescripcionGrado(especialidadAcademicaDTO.getDescripcionGrado().toUpperCase());
					if(especialidadAcademicaDTO.getDescripcionOtroCentro()!=null)
						especialidadAcademicaDTO.setDescripcionOtroCentro(especialidadAcademicaDTO.getDescripcionOtroCentro().toUpperCase());
					especialidadAcademicaDTO.setDescTipoFormacion(repositorioDatos.getLabelParametro(especialidadAcademicaDTO.getIndTipoFormacion().longValue()).toUpperCase());
					especialidadAcademicaDTO.setDescPais(repositorioDatos.getLabelPais(especialidadAcademicaDTO.getIdPais().longValue()).toUpperCase());
					especialidadAcademicaDTO.setDescAreaProfesion(repositorioDatos.getLabelAreaProfesion(especialidadAcademicaDTO.getIdAreaProfesion()).toUpperCase());
					especialidadAcademicaDTO.setDescCentroEstudios(repositorioDatos.getLabelCentroEstudios(especialidadAcademicaDTO.getIdCentroEstudios()).toUpperCase());
					especialidadAcademicaDTO.setDescGradoObtenido(repositorioDatos.getLabelParametro(especialidadAcademicaDTO.getIndGradoObtenido().longValue()).toUpperCase());
				}
			}else{
				return new ArrayList<EspecialidadAcademicaDTO>();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return listArbEspecialidadAcademica;
	}

	public List ObtenerListaEspDocencia(RepositorioDatos repositorioDatos,FichaArbitralDTO fichaArbitral){
		List<DocenciaDTO> listArbEspecialDocencia=new ArrayList<DocenciaDTO>();
		try {
			listArbEspecialDocencia=registrarFichaArbitroService.obtenerFichaDocencia(fichaArbitral.getIdFicha());
			
			if (listArbEspecialDocencia!= null) {
				for (DocenciaDTO docenciaDTO : listArbEspecialDocencia) {
					docenciaDTO.setDescEspecialidad(getDescEspecialidad(docenciaDTO.getIndEspecialidad()) );
					docenciaDTO.setIdEstadoFicha(fichaArbitral.getIdEstadoFicha());
					docenciaDTO.setDescripcionCurso(docenciaDTO.getDescripcionCurso().toUpperCase());					
					docenciaDTO.setDescCentroEstudios(repositorioDatos.getLabelCentroEstudios(docenciaDTO.getIdCentroEstudios().longValue()).toUpperCase().toUpperCase());
					docenciaDTO.setDescTipoActividad(repositorioDatos.getLabelParametro(docenciaDTO.getIndTipoActividad().longValue()).toUpperCase().toUpperCase());
					docenciaDTO.setDescTipoDuracion(repositorioDatos.getLabelParametro(docenciaDTO.getIndTipoDuracion().longValue()).toUpperCase());
				}								  
			}	else{
				return new ArrayList<DocenciaDTO>();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return listArbEspecialDocencia;
	}

	public List ObtenerListaEspCapacitacion(RepositorioDatos repositorioDatos,FichaArbitralDTO fichaArbitral){
		List<CapacitacionDTO> listArbEspecialCapacitacion=new ArrayList<CapacitacionDTO>();
		try {
			listArbEspecialCapacitacion=registrarFichaArbitroService.obtenerFichaCapacitacion(fichaArbitral.getIdFicha());
			
			if (listArbEspecialCapacitacion != null) {
				for (CapacitacionDTO capacitacionDTO : listArbEspecialCapacitacion) {
					capacitacionDTO.setDescEspecialidad(getDescEspecialidad(capacitacionDTO.getIndEspecialidad()) );
					capacitacionDTO.setIdEstadoFicha(fichaArbitral.getIdEstadoFicha());
					capacitacionDTO.setNomCapacitacion(capacitacionDTO.getNomCapacitacion().toUpperCase());
					capacitacionDTO.setNomInstitucion(capacitacionDTO.getNomInstitucion().toUpperCase());
				}
			}else{
				return new ArrayList<CapacitacionDTO>();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listArbEspecialCapacitacion;
	}
	
	public List ObtenerListaArbitrajePublico(RepositorioDatos repositorioDatos,FichaArbitralDTO fichaArbitral){
		List<TrayectoriaArbitralDTO> listArbEspecialTrayectoriaArbitralPublic=new ArrayList<TrayectoriaArbitralDTO>();
		try {
			listArbEspecialTrayectoriaArbitralPublic=registrarFichaArbitroService.obtenerFichaTrayectoria(fichaArbitral.getIdFicha(),"PUBLICA");
			
			if (listArbEspecialTrayectoriaArbitralPublic!= null) {
				for (TrayectoriaArbitralDTO trayectoriaArbitralDTO : listArbEspecialTrayectoriaArbitralPublic) {
					trayectoriaArbitralDTO.setDescEspecialidad(getDescEspecialidad(trayectoriaArbitralDTO.getIndEspecialidad()) );
					trayectoriaArbitralDTO.setIdEstadoFicha(fichaArbitral.getIdEstadoFicha());
					trayectoriaArbitralDTO.setNomEntidad(trayectoriaArbitralDTO.getNomEntidad().toUpperCase());
					trayectoriaArbitralDTO.setNomContratista(trayectoriaArbitralDTO.getNomContratista().toUpperCase());
					trayectoriaArbitralDTO.setObjContratacion(trayectoriaArbitralDTO.getObjContratacion().toUpperCase());
					trayectoriaArbitralDTO.setNumContrato(trayectoriaArbitralDTO.getNumContrato().toUpperCase());
					trayectoriaArbitralDTO.setProcesoSeleccion(trayectoriaArbitralDTO.getProcesoSeleccion().toUpperCase());					
					trayectoriaArbitralDTO.setDescMateriaControvertida(repositorioDatos.getLabelParametro(trayectoriaArbitralDTO.getIdMateriaControvertida().longValue()).toUpperCase());
					trayectoriaArbitralDTO.setDescTipoArbitraje(repositorioDatos.getLabelParametro(trayectoriaArbitralDTO.getIndTipoArbitraje().longValue()).toUpperCase());
				}
			}else{
				return new ArrayList<TrayectoriaArbitralDTO>();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return listArbEspecialTrayectoriaArbitralPublic;
	}

	public List ObtenerListaArbitrajePrivado(RepositorioDatos repositorioDatos,FichaArbitralDTO fichaArbitral){
		List<TrayectoriaArbitralDTO> listArbEspecialTrayectoriaArbitralPriv=new ArrayList<TrayectoriaArbitralDTO>();
		try {
			listArbEspecialTrayectoriaArbitralPriv=registrarFichaArbitroService.obtenerFichaTrayectoria(fichaArbitral.getIdFicha(),"PRIVADO");
			
			if (listArbEspecialTrayectoriaArbitralPriv!= null) {
				for (TrayectoriaArbitralDTO trayectoriaArbitralDTO : listArbEspecialTrayectoriaArbitralPriv) {
					trayectoriaArbitralDTO.setDescEspecialidad(getDescEspecialidad(trayectoriaArbitralDTO.getIndEspecialidad()) );
					trayectoriaArbitralDTO.setIdEstadoFicha(fichaArbitral.getIdEstadoFicha());
					trayectoriaArbitralDTO.setNomEntidad(trayectoriaArbitralDTO.getNomEntidad().toUpperCase());
					trayectoriaArbitralDTO.setNomContratista(trayectoriaArbitralDTO.getNomContratista().toUpperCase());					
					trayectoriaArbitralDTO.setNumContrato(trayectoriaArbitralDTO.getNumContrato().toUpperCase());						
					trayectoriaArbitralDTO.setDescMateriaControvertida(repositorioDatos.getLabelParametro(trayectoriaArbitralDTO.getIdMateriaControvertida().longValue()).toUpperCase());
					trayectoriaArbitralDTO.setDescTipoArbitraje(repositorioDatos.getLabelParametro(trayectoriaArbitralDTO.getIndTipoArbitraje().longValue()).toUpperCase());
				}
			}else{
				return new ArrayList<TrayectoriaArbitralDTO>();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return listArbEspecialTrayectoriaArbitralPriv;
	}

	public List ObtenerListaExpLaboral(RepositorioDatos repositorioDatos,FichaArbitralDTO fichaArbitral){
		List<ExperienciaLaboralDTO> listArbEspecialExperienciaLaboral=new ArrayList<ExperienciaLaboralDTO>();
		try {
			listArbEspecialExperienciaLaboral=registrarFichaArbitroService.obtenerFichaExpLaboral(fichaArbitral.getIdFicha());
			
			if (listArbEspecialExperienciaLaboral!= null) {
				for (ExperienciaLaboralDTO experienciaLaboralDTO : listArbEspecialExperienciaLaboral) {
					experienciaLaboralDTO.setDescEspecialidad(getDescEspecialidad(experienciaLaboralDTO.getIndEspecialidad()) );
					experienciaLaboralDTO.setIdEstadoFicha(fichaArbitral.getIdEstadoFicha());
					experienciaLaboralDTO.setNomCentroTrabajo(experienciaLaboralDTO.getNomCentroTrabajo().toUpperCase());
					experienciaLaboralDTO.setDescripcionCargo(experienciaLaboralDTO.getDescripcionCargo().toUpperCase());
					experienciaLaboralDTO.setVigente(convertAString(experienciaLaboralDTO.getIndicadorActual()));
				}
			}else{
				return new ArrayList<ExperienciaLaboralDTO>();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return listArbEspecialExperienciaLaboral;
	}
	public String convertAString(boolean indicador){
		if(indicador==true){
			return "SI";
		}else{
			return "NO";
		}
		
	}
	/**===========  ZONA DE GETTERS Y SETTERS  ============*/

	
	/**
	 * Metodo que permite obtener fichaArbitral.
	 * @return fichaArbitral , tipo FichaArbitralDTO.
	 */
	public FichaArbitralDTO getFichaArbitral() {
		return fichaArbitral;
	}
	/**
	 * Permite actualizar fichaArbitral.
	 * @param fichaArbitral, tipo FichaArbitralDTO.
	 */
	public void setFichaArbitral(FichaArbitralDTO fichaArbitral) {
		this.fichaArbitral = fichaArbitral;
	}

	/**
	 * Metodo que permite obtener modalidad.
	 * @return modalidad , tipo String.
	 */
	public String getModalidad() {
		return modalidad;
	}

	/**
	 * Permite actualizar modalidad.
	 * @param modalidad, tipo String.
	 */
	public void setModalidad(String modalidad) {
		this.modalidad = modalidad;
	}
	/**
	 * Metodo que permite obtener msjValidacion.
	 * @return msjValidacion , tipo List<String>.
	 */
	public List<String> getMsjValidacion() {
		return msjValidacion;
	}
	/**
	 * Permite actualizar msjValidacion.
	 * @param msjValidacion, tipo List<String>.
	 */
	public void setMsjValidacion(List<String> msjValidacion) {
		this.msjValidacion = msjValidacion;
	}

	
	
}
